package cn.raths.filter;

import com.alibaba.fastjson.JSON;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
* @Title:
* @Description: 登录拦截
* @Author: Lynn
* @Version: 1.0
* @Date:  2022/7/31 12:48
* @Parameters:
* @Return
*/
@Component
@Slf4j
public class LoginFilter extends ZuulFilter {

    /**
    * 申明拦截器类型
     * “pre”前置（”custom”自定义一般是前置），“routing”路由，“post”后置，以及“error”
    */
    @Override
    public String filterType() {
        return "pre";
    }

    /**
    * 优先级，数字越小越先执行
    */
    @Override
    public int filterOrder() {
        return 0;
    }

    /**
     * 是否执行run方法，可做资源放行等
     */
    @Override
    public boolean shouldFilter() {
        // 获取请求路径
        // 获取请求对象
        HttpServletRequest request = RequestContext.getCurrentContext().getRequest();
        String uri = request.getRequestURI();

        log.info("请求地址：" + uri);

        // 判断访问路径是否为放行路径
        return isRelease(uri);
    }
    public boolean isRelease(String url){
        // /static/**  ，/login , /register 不需要做登录检查，返回false
        if(url.endsWith("/register")
                || url.endsWith("/login")
                || url.contains("/static")){
            return false;
        }
        return true;
    }

    /**
    * 拦截业务
    */
    @Override
    public Object run() throws ZuulException {
        // 获取请求
        HttpServletRequest request = RequestContext.getCurrentContext().getRequest();

        // 获取请求头中的token
        String token = request.getHeader("token");
        // 判断token是否存在，是否为空
        if(!tokenIsEfficient(token)){
            // 编写返回信息
            Map<String, Object> map = new HashMap<>();
            map.put("code",402);
            map.put("massage","noLogin");
            map.put("success",false);
            map.put("data","其他数据");

            // 将map转换为json字符串
            String jsonString = JSON.toJSONString(map);

            // 获取响应
            HttpServletResponse response = RequestContext.getCurrentContext().getResponse();
            // 设置字符集
            response.setCharacterEncoding("utf-8");

            response.setStatus(402);
            try {
                response.getWriter().write(jsonString);
            } catch (IOException e) {
                e.printStackTrace();
            }
            // 不再继续执行
            RequestContext.getCurrentContext().setSendZuulResponse(false);

        }

        // 正常执行到这儿就是放行
        return null;
    }
    // 判断token是否有效
    public boolean tokenIsEfficient(String token){
        return token != null && !StringUtils.isBlank(token); // isBlank 空字符串也为true
    }
}
